home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / misc / dspice0s / mosq3.c < prev    next >
C/C++ Source or Header  |  1992-11-21  |  7KB  |  254 lines

  1. /* mosq3.f -- translated by f2c (version of 3 February 1990  3:36:42).
  2.    You must link the resulting object file with the libraries:
  3.     -lF77 -lI77 -lm -lc   (in that order)
  4. */
  5.  
  6. #include "f2c.h"
  7.  
  8. /*<       subroutine mosq3(vds,vbs,vgs,vdsat,vth,vbin,gamasd,cox,phi, >*/
  9. /*<      1   qg,qc,qb,cggb,cgdb,cgsb,cbgb,cbdb,cbsb) >*/
  10. /* Subroutine */ int mosq3_(vds, vbs, vgs, vdsat, vth, vbin, gamasd, cox, phi,
  11.      qg, qc, qb, cggb, cgdb, cgsb, cbgb, cbdb, cbsb)
  12. doublereal *vds, *vbs, *vgs, *vdsat, *vth;
  13. doublereal *vbin, *gamasd;
  14. doublereal *cox, *phi, *qg, *qc, *qb, *cggb, *cgdb, *cgsb, *cbgb, *cbdb, *
  15.     cbsb;
  16. {
  17.     /* System generated locals */
  18.     static doublereal equiv_0[1], equiv_1[1], equiv_2[1], equiv_3[1];
  19.  
  20.     /* Builtin functions */
  21.     double sqrt();
  22.  
  23.     /* Local variables */
  24.     static doublereal arga, vbix;
  25. #define utra (equiv_3)
  26.     static doublereal onxl;
  27. #define uexp (equiv_2)
  28.     static doublereal vdsx, vgsx, dadfb, dadco, gamma, dadvd;
  29. #define alpha (equiv_0)
  30.     static doublereal fbody;
  31. #define theta (equiv_1)
  32.     static doublereal phibs, gamma2, dfbdvb, dcodvb, dqbdvb, dcodvd, xl, 
  33.         gammas;
  34. #define xlamda (equiv_0)
  35.     static doublereal dcodvg, dfsdvb, onfbdy, qbonco, dsqdvb;
  36. #define xkappa (equiv_3)
  37.     static doublereal fbodys, dvtdvb, dvtdvd, fnarrw, sqphbs, fshort, cdo;
  38. #define eta (equiv_2)
  39.     static doublereal vfb, vgb, vbi;
  40. #define vbp (equiv_1)
  41.     static doublereal von;
  42.  
  43. /*<       implicit double precision (a-h,o-z) >*/
  44.  
  45. /*<       equivalence (xlamda,alpha),(vbp,theta),(uexp,eta),(utra,xkappa) >*/
  46.  
  47. /*     charge equations are referenced to bulk */
  48.  
  49. /*<       vgb=vgs-vbs >*/
  50.     vgb = *vgs - *vbs;
  51. /*<       vfb=vbi-phi >*/
  52.     vfb = vbi - *phi;
  53. /*<       onxl=1.0d0/xl >*/
  54.     onxl = 1. / xl;
  55. /*<       phibs=sqphbs*sqphbs >*/
  56.     phibs = sqphbs * sqphbs;
  57.  
  58. /*     body effect */
  59.  
  60. /*<       gammas=gamma*fshort >*/
  61.     gammas = gamma * fshort;
  62. /*<       fbodys=gammas/(sqphbs+sqphbs)*0.5d0 >*/
  63.     fbodys = gammas / (sqphbs + sqphbs) * .5;
  64. /*<       fbody=fbodys+fnarrw >*/
  65.     fbody = fbodys + fnarrw;
  66. /*<       onfbdy=1.0d0/(1.0d0+fbody) >*/
  67.     onfbdy = 1. / (fbody + 1.);
  68. /*<       dfbdvb=-fbodys*dsqdvb/sqphbs+fbodys*dfsdvb/fshort >*/
  69.     dfbdvb = -fbodys * dsqdvb / sqphbs + fbodys * dfsdvb / fshort;
  70. /*<       qbonco=gammas*sqphbs+fnarrw*phibs >*/
  71.     qbonco = gammas * sqphbs + fnarrw * phibs;
  72. /*<       dqbdvb=gammas*dsqdvb+gamma*dfsdvb*sqphbs-fnarrw >*/
  73.     dqbdvb = gammas * dsqdvb + gamma * dfsdvb * sqphbs - fnarrw;
  74.  
  75. /* .....static feedback effect */
  76.  
  77. /*<       vbix=vbi-eta*vds >*/
  78.     vbix = vbi - *eta * *vds;
  79.  
  80. /* .....threshold voltage */
  81.  
  82. /*<       vth=vbix+qbonco >*/
  83.     *vth = vbix + qbonco;
  84. /*<       dvtdvd=-eta >*/
  85.     dvtdvd = -(*eta);
  86. /*<       dvtdvb=dqbdvb >*/
  87.     dvtdvb = dqbdvb;
  88.  
  89. /*     branch according to region of operation */
  90.  
  91. /*<       if (vgs.le.vth) go to 800 >*/
  92.     if (*vgs <= *vth) {
  93.     goto L800;
  94.     }
  95. /*<       vgsx=dmax1(vgs,von) >*/
  96.     vgsx = max(*vgs,von);
  97.  
  98. /*     branch on vds=0.0d0 */
  99.  
  100. /*<       vdsx=dmin1(vds,vdsat) >*/
  101.     vdsx = min(*vds,*vdsat);
  102. /*<       if ( vdsx.eq.0.0d0 ) go to 900 >*/
  103.     if (vdsx == 0.) {
  104.     goto L900;
  105.     }
  106. /*<       cdo=vgsx-vth-0.5d0*(1.0d0+fbody)*vdsx >*/
  107.     cdo = vgsx - *vth - (fbody + 1.) * .5 * vdsx;
  108. /*<       dcodvg=1.0d0 >*/
  109.     dcodvg = 1.;
  110. /*<       if (vds.lt.vdsat) dcodvd=-dvtdvd-0.5d0*(1.0d0+fbody) >*/
  111.     if (*vds < *vdsat) {
  112.     dcodvd = -dvtdvd - (fbody + 1.) * .5;
  113.     }
  114. /*<       dcodvb=-dvtdvb-0.5d0*dfbdvb*vdsx >*/
  115.     dcodvb = -dvtdvb - dfbdvb * .5 * vdsx;
  116.  
  117. /* .....charge terms */
  118.  
  119. /*< 420   continue >*/
  120. /* L420: */
  121. /*<       arga=(1.0d0+fbody)*vdsx*vdsx/(12.0d0*cdo) >*/
  122.     arga = (fbody + 1.) * vdsx * vdsx / (cdo * 12.);
  123. /*<       dadco=-arga/cdo >*/
  124.     dadco = -arga / cdo;
  125. /*<       if (vds.lt.vdsat) dadvd=arga/vdsx >*/
  126.     if (*vds < *vdsat) {
  127.     dadvd = arga / vdsx;
  128.     }
  129. /*<       dadfb=arga*onfbdy >*/
  130.     dadfb = arga * onfbdy;
  131.  
  132. /* .....gate charge */
  133.  
  134. /*<       qg=cox*(vgs-vbix-0.5d0*vdsx+arga) >*/
  135.     *qg = *cox * (*vgs - vbix - vdsx * .5 + arga);
  136. /*<       cggb=cox*(1.0d0+dadco*dcodvg) >*/
  137.     *cggb = *cox * (dadco * dcodvg + 1.);
  138. /*<       if (vds.lt.vdsat) cgdb=cox*(-dvtdvd-0.5d0+dadvd+dadco*dcodvd) >*/
  139.     if (*vds < *vdsat) {
  140.     *cgdb = *cox * (-dvtdvd - .5 + dadvd + dadco * dcodvd);
  141.     }
  142. /*<       cgsb=-cggb-cgdb-cox*(dadco*dcodvb+dadfb*dfbdvb) >*/
  143.     *cgsb = -(*cggb) - *cgdb - *cox * (dadco * dcodvb + dadfb * dfbdvb);
  144.  
  145. /* .....bulk charge */
  146.  
  147. /*<       arga=arga*fbody >*/
  148.     arga *= fbody;
  149. /*<       dadco=dadco*fbody >*/
  150.     dadco *= fbody;
  151. /*<       if (vds.lt.vdsat) dadvd=dadvd*fbody >*/
  152.     if (*vds < *vdsat) {
  153.     dadvd *= fbody;
  154.     }
  155. /*<       dadfb=dadfb*(1.0d0+fbody+fbody) >*/
  156.     dadfb *= fbody + 1. + fbody;
  157.  
  158. /*<       qb=-cox*(qbonco+0.5d0*fbody*vdsx-arga) >*/
  159.     *qb = -(*cox) * (qbonco + fbody * .5 * vdsx - arga);
  160. /*<       cbgb=cox*dadco*dcodvg >*/
  161.     *cbgb = *cox * dadco * dcodvg;
  162. /*<       if (vds.lt.vdsat) cbdb=-cox*(0.5d0*fbody-dadvd-dadco*dcodvd) >*/
  163.     if (*vds < *vdsat) {
  164.     *cbdb = -(*cox) * (fbody * .5 - dadvd - dadco * dcodvd);
  165.     }
  166. /*<       cbsb=-cbgb-cbdb >*/
  167. /*<      1          +cox*(dqbdvb+(0.5d0*vdsx-dadfb)*dfbdvb-dadco*dcodvb) >*/
  168.     *cbsb = -(*cbgb) - *cbdb + *cox * (dqbdvb + (vdsx * .5 - dadfb) * dfbdvb 
  169.         - dadco * dcodvb);
  170. /*<       go to 1000 >*/
  171.     goto L1000;
  172.  
  173. /* .....charge terms of vgs<vth */
  174.  
  175. /*< 800   continue >*/
  176. L800:
  177. /*<       if ( vgb.gt.vfb ) go to 810 >*/
  178.     if (vgb > vfb) {
  179.     goto L810;
  180.     }
  181. /*<       qg=cox*(vgb-vfb) >*/
  182.     *qg = *cox * (vgb - vfb);
  183. /*<       cggb=cox >*/
  184.     *cggb = *cox;
  185. /*<       go to  820 >*/
  186.     goto L820;
  187. /*< 810   continue >*/
  188. L810:
  189. /*<       gamma2=gammas*0.5d0 >*/
  190.     gamma2 = gammas * .5;
  191. /*<       arga=dsqrt(gamma2*gamma2+(vgb-vfb)) >*/
  192.     arga = sqrt(gamma2 * gamma2 + (vgb - vfb));
  193. /*<       qg=gammas*cox*(arga-gamma2) >*/
  194.     *qg = gammas * *cox * (arga - gamma2);
  195. /*<       cggb=0.5d0*cox*gammas/arga >*/
  196.     *cggb = *cox * .5 * gammas / arga;
  197. /*< 820   continue >*/
  198. L820:
  199. /*<       qb=-qg >*/
  200.     *qb = -(*qg);
  201. /*<       cbgb=-cggb >*/
  202.     *cbgb = -(*cggb);
  203. /*<       cgdb=0.0d0 >*/
  204.     *cgdb = 0.;
  205. /*<       cgsb=0.0d0 >*/
  206.     *cgsb = 0.;
  207. /*<       cbdb=0.0d0 >*/
  208.     *cbdb = 0.;
  209. /*<       cbsb=0.0d0 >*/
  210.     *cbsb = 0.;
  211. /*<       go to 1000 >*/
  212.     goto L1000;
  213.  
  214. /*     special case vds=0.0d0 */
  215.  
  216. /*<   900 qg=cox*(vgs-vbi) >*/
  217. L900:
  218.     *qg = *cox * (*vgs - vbi);
  219. /*<       qb=-cox*qbonco >*/
  220.     *qb = -(*cox) * qbonco;
  221. /*<       cggb=cox >*/
  222.     *cggb = *cox;
  223. /*<       cgdb=-cox*(0.5d0+dvtdvd) >*/
  224.     *cgdb = -(*cox) * (dvtdvd + .5);
  225. /*<       cgsb=-cox*(0.5d0-dvtdvb) >*/
  226.     *cgsb = -(*cox) * (.5 - dvtdvb);
  227. /*<       cbgb=0.0d0 >*/
  228.     *cbgb = 0.;
  229. /*<       cbdb=-0.5d0*cox*fbody >*/
  230.     *cbdb = *cox * -.5 * fbody;
  231. /*<       cbsb=cox*(dqbdvb+0.5d0*fbody) >*/
  232.     *cbsb = *cox * (dqbdvb + fbody * .5);
  233.  
  234. /*     done */
  235.  
  236. /*<  1000 qc=-(qg+qb) >*/
  237. L1000:
  238.     *qc = -(*qg + *qb);
  239. /*<       return >*/
  240.     return 0;
  241. /*<       end >*/
  242. } /* mosq3_ */
  243.  
  244. #undef vbp
  245. #undef eta
  246. #undef xkappa
  247. #undef xlamda
  248. #undef theta
  249. #undef alpha
  250. #undef uexp
  251. #undef utra
  252.  
  253.  
  254.